# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django_countries import *
from indicadores.models import IndicadoresBooleanos, IndicadoresChoices, IndicadoresEnteros,IndicadoresPorcentaje , RespuestaBooleanos, RespuestaChoices, RespuestaEnteros, RespuestaPorcentaje
from universidades.models import Universidad, Region
from decimal import Decimal
from validaciones.models import checkpermiso, respuestahttp
from universidades.views import sidebar
from timeit import itertools

from operator import itemgetter
from itertools import groupby
# -*- coding: utf-8 -*-

Permisos = ['validaciones.Ver_reportes'] #para verificar en los reportes
ANCHO_GRAFICO = 320
ALTO_GRAFICO = 240
COLORES = '3072F3|FD4433|00FF00|008011|49CC8F|FF0000|CC00ED|FF9900|0000FF|80C65A|FFFF00|C2BDDD|CCCC33|EDEDEF'
DIMENSIONES = ((1,'Formacion Continua'),(2, 'Transferencia del conocimiento'),(3, 'Compromiso Social'))

def generar_reporte_regional(request, pk_region, dimension = '0'):
    
    if checkpermiso(request.user, Permisos):
        #return redirect('/plataforma')
        return HttpResponse(respuestahttp())

    region = Region.objects.get(id = pk_region)
    nombre_region = region.nombre
    values = []
    # Iterar para formacion continua
    if dimension == '1' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(pk_region, 1,'')
        # Choices
        valores.extend(obtener_choices(pk_region, 1,'')) 
        # Enteros
        valores.extend(obtener_enteros(pk_region, 1,'')) 
        # Porcentaje
        valores.extend(obtener_porcentaje(pk_region, 1,''))
        values.append(("Formacion Continua", valores))
    
    
    # Iterar para transferencia del conocimiento
    
    if dimension == '2' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(pk_region, 2,'')
        # Choices
        valores.extend(obtener_choices(pk_region, 2,'')) 
        # Enteros
        valores.extend(obtener_enteros(pk_region, 2,'')) 
        # Porcentaje
        valores.extend(obtener_porcentaje(pk_region, 2,''))
        values.append(("Transferencia del conocimiento", valores))
        
    # Iterar para Compromiso Social
    
    if dimension == '3' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(pk_region, 3,'')
        # Choices
        valores.extend(obtener_choices(pk_region, 3,'')) 
        # Enteros
        valores.extend(obtener_enteros(pk_region, 3,'')) 
        # Porcentaje
        valores.extend(obtener_porcentaje(pk_region, 3,''))
        values.append(("Compromiso social", valores))
    
    titulo_del_informe= 'Reporte Pais: '+nombre_region
    menu= sidebar(request)
    return render_to_response("reportes_graficos.html", locals() , context_instance=RequestContext(request))


def generar_reporte_dimension(request, dimension):
    
    if checkpermiso(request.user, Permisos):
        #return redirect('/plataforma')
        return HttpResponse(respuestahttp())

    nombre_dimension = ''
    if dimension == '1':
        nombre_dimension = 'Formacion Continua'
    elif dimension == '2':
        nombre_dimension = 'Transferencia del conocimiento'
    elif dimension == '3':
        nombre_dimension = 'Compromiso social'
    
    values = []
    # Iterar para formacion continua
    
    # Itera para valores booleanos
    valores = obtener_booleanos(-1, dimension,'')
    # Choices
    valores.extend(obtener_choices(-1, dimension,'')) 
    # Enteros
    valores.extend(obtener_enteros(-1, dimension,'')) 
    # Porcentaje
    valores.extend(obtener_porcentaje(-1, dimension,''))
    
    values.append((nombre_dimension, valores))
    
    titulo_del_informe = 'Reporte por dimension: ' + nombre_dimension
    
    menu= sidebar(request)
    return render_to_response("reportes_graficos.html", locals() , context_instance=RequestContext(request))


def generar_reporte_pais(request, pais, dimension = '0'):
    
    if checkpermiso(request.user, Permisos):
        #return redirect('/plataforma')
        return HttpResponse(respuestahttp())

    values = []
    # Iterar para formacion continua
    
    if dimension == '1' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(-2, 1, pais)
        # Choices
        valores.extend(obtener_choices(-2, 1, pais)) 
        # Enteros
        valores.extend(obtener_enteros(-2, 1, pais)) 
        # Porcentaje
        valores.extend(obtener_porcentaje(-2, 1, pais))
        values.append(("Formacion Continua", valores))
    
    
    # Iterar para transferencia del conocimiento
    if dimension == '2' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(-2, 2, pais)
        # Choices
        valores.extend(obtener_choices(-2, 2, pais)) 
        # Enteros
        valores.extend(obtener_enteros(-2, 2, pais)) 
        # Porcentaje
        valores.extend(obtener_porcentaje(-2, 2, pais))
        values.append(("Transferencia del conocimiento", valores))
    
    # Iterar para Compromiso Social
    
    if dimension == '3' or dimension == '0':
        # Itera para valores booleanos
        valores = obtener_booleanos(-2, 3, pais)
        # Choices
        valores.extend(obtener_choices(-2, 3, pais)) 
        # Enteros
        valores.extend(obtener_enteros(-2, 3, pais)) 
        # Porcentaje
        valores.extend(obtener_porcentaje(-2, 3, pais))
        values.append(("Compromiso social", valores))
        
    universidad = Universidad.objects.filter(pais = pais)[:1]
    
    titulo_del_informe = universidad[0].pais.name
    menu= sidebar(request)
    return render_to_response("reportes_graficos.html", locals() , context_instance=RequestContext(request))

def generar_reporte_general(request):
    
    if checkpermiso(request.user, Permisos):
        #return redirect('/plataforma')
        return HttpResponse(respuestahttp())
        
    values = []
    # Iterar para formacion continua 
    # Itera para valores booleanos
    valores = obtener_booleanos(-1, 1,'')
    # Choices
    valores.extend(obtener_choices(-1, 1,'')) 
    # Enteros
    valores.extend(obtener_enteros(-1, 1,'')) 
    # Porcentaje
    valores.extend(obtener_porcentaje(-1, 1,''))
    values.append(("Formacion continua", valores))
    
    # Iterar para transformacion del conocimiento
    # Itera para valores booleanos
    valores = obtener_booleanos(-1, 2,'')
    # Choices
    valores.extend(obtener_choices(-1, 2,'')) 
    # Enteros
    valores.extend(obtener_enteros(-1, 2,'')) 
    # Porcentaje
    valores.extend(obtener_porcentaje(-1, 2,''))
    values.append(("Transferencia del conocimiento", valores))
    
    # Iterar para compromiso social
    # Itera para valores booleanos
    valores = obtener_booleanos(-1, 3,'')
    # Choices
    valores.extend(obtener_choices(-1, 3,'')) 
    # Enteros
    valores.extend(obtener_enteros(-1, 3,'')) 
    # Porcentaje
    valores.extend(obtener_porcentaje(-1, 3,''))
    values.append(("Compromiso Social", valores))
    
    titulo_del_informe = 'Reporte General'
    menu= sidebar(request)
    return render_to_response("reportes_graficos.html", locals() , context_instance=RequestContext(request))

def obtener_booleanos(region, dimension, pais):
    indicadores = IndicadoresBooleanos.objects.filter(dimension=dimension)

    if region == -1:
        #Todas las regiones
        universidades = Universidad.objects.all()
    elif region == -2:
        #Universidades de un pais
        universidades = Universidad.objects.filter(pais = pais)
    else:    
        universidades = Universidad.objects.filter(region_id=region)
    values = []
    for i in indicadores:
        suma_si = 0
        suma_no = 0
        suma_noaplica = 0
        for u in universidades:
            respuestas_bool = RespuestaBooleanos.objects.filter( universidad = u.id, indicador_id = i.id ).order_by( '-fecha_fin' )
            
            if not respuestas_bool.count() == 0:
                respuestas_bool = RespuestaBooleanos.objects.filter( universidad = u.id, indicador_id = i.id , fecha_fin = respuestas_bool[0].fecha_fin )
                for r in respuestas_bool:
                    if r.respuesta == 1:
                        suma_si += 1
                    if r.respuesta == 0:
                        suma_no += 1
                    if r.respuesta == 2:
                        suma_noaplica += 1
            else:
                pass

        
        # armar el grafico aca
        pregunta = i.nombre
        grafico = 'chs=' + str(ANCHO_GRAFICO) + 'x' + str(ALTO_GRAFICO) + '\n' + 'cht=p3\n' + 'chco='+ COLORES + '\n' 
        grafico = grafico + 'chds=0,100\n' + 'chd=t:' + str(suma_si) + ',' + str(suma_no) + ',' + str(suma_noaplica)+ '\n' + 'chdl= Si(' + str(suma_si) + ')|No(' + str(suma_no) + ') | No Aplica(' + str(suma_noaplica) +')\n'

        if suma_no == 0 and suma_si == 0:
            break
        else:
            values.append((pregunta , grafico))
    
    return values

def obtener_choices(region, dimension, pais):
    indicadores = IndicadoresChoices.objects.filter(dimension=dimension)
    if region == -1:
        #Todas las regiones
        universidades = Universidad.objects.all()
    elif region == -2:
        #Universidades de un pais
        universidades = Universidad.objects.filter(pais = pais)
    else:    
        universidades = Universidad.objects.filter(region_id=region)
    values = []
    for i in indicadores:
        suma_1 = 0
        suma_2 = 0
        suma_3 = 0
        suma_4 = 0
        suma_5 = 0
        
        for u in universidades:
            respuestas_choice = RespuestaChoices.objects.filter( universidad = u.id, indicador_id = i.id ).order_by( '-fecha_fin' )
            if not respuestas_choice.count() == 0:
                respuestas_choice = RespuestaChoices.objects.filter( universidad = u.id, indicador_id = i.id , fecha_fin = respuestas_choice[0].fecha_fin )
                for r in respuestas_choice:
                    if r.respuesta == 1:
                        suma_1 += 1
                    elif r.respuesta == 2:
                        suma_2 += 1
                    elif r.respuesta == 3:
                        suma_3 += 1
                    elif r.respuesta == 4:
                        suma_4 += 1
                    elif r.respuesta == 5:
                        suma_5 += 1
            else:
                pass
        
        pregunta = i.nombre
        grafico = 'chs=' + str(ANCHO_GRAFICO) + 'x' + str(ALTO_GRAFICO) + '\n' + 'cht=p3\n'
        grafico = grafico + 'chco='+COLORES+'\n' + 'chds=0,1000\n' 
        grafico = grafico + 'chd=t:' + str(suma_1) + ',' + str(suma_2)+ ',' + str(suma_3)+ ',' + str(suma_4) + ',' + str(suma_5) +'\n' 
        grafico = grafico + 'chdl=  Mala(' + str(suma_1) + ')|Buena(' + str(suma_2) + ')|Muy+Buena(' + str(suma_3) + ')|Excelente(' + str(suma_4) + ')|No+Aplica(' + str(suma_5) + ')\n'

        if suma_1 == 0 and suma_2 == 0 and suma_3 == 0 and suma_4 == 0 and suma_5 ==0:
            break
        else:
            values.append((pregunta, grafico))
    
    return values

def obtener_enteros(region, dimension, pais):
    indicadores = IndicadoresEnteros.objects.filter(dimension=dimension)
    if region == -1:
        #Todas las regiones
        universidades = Universidad.objects.all()
    elif region == -2:
        #Universidades de un pais
        universidades = Universidad.objects.filter(pais = pais)
    else:    
        universidades = Universidad.objects.filter(region_id=region)
    values = []
    for i in indicadores:
        
        universidad = []
        suma_universidades = []
        nro_de_universidades = universidades.count()
        suma_general = 0
        
        for u in universidades:
            respuestas_choice = RespuestaEnteros.objects.filter( universidad = u.id, indicador_id = i.id ).order_by( '-fecha_fin' )
            if not respuestas_choice.count() == 0:
            
                respuestas_choice = RespuestaEnteros.objects.filter( universidad = u.id, indicador_id = i.id , fecha_fin = respuestas_choice[0].fecha_fin )

                suma_por_universidad = 0
                for r in respuestas_choice:
                    suma_por_universidad += r.respuesta
                      
                suma_general += suma_por_universidad
                suma_universidades.append(suma_por_universidad)
                universidad.append(u.nombre)
            else:
                pass
        
        # Armar valores de retorno
        valores = []
        if suma_general == -1.00:
            valores.append(0)
        else:
            valores.append(suma_general)
        
        for y in suma_universidades:
            if y == -1.00:
                valores.append(0)
            else:
                valores.append(y)        
        
        
        etiquetas = []
        etiquetas.append("Total")
        for u in universidad:
            etiquetas.append(u)
        
        etiquetas_con_valores = ''
        lista_de_valores = ''
        for y in range (0, len(etiquetas)):
            etiquetas_con_valores += str(etiquetas[y].encode("utf-8")).replace(" ", "+") + '(' + str(valores[y]) + ')'
            lista_de_valores += str(valores[y])
            if y+1 != len(etiquetas):
                etiquetas_con_valores += '|'
                lista_de_valores += ','        
        
        #rango de valores
        limite_superior = max(valores) + 30
        #armar el grafico
        grafico = 'chxr=0,0,' + str(limite_superior) + '\n'
        grafico += 'chxt=x \n chbh=a \n'
        grafico += 'chs=' + str(ANCHO_GRAFICO) + 'x' + str(ALTO_GRAFICO*2) + '\n'
        grafico += 'cht=bhg'+ '\n'
        grafico += 'chco='+COLORES+ '\n'
        grafico += 'chd=t:'+ lista_de_valores + '\n'
        grafico += 'chdl='+ etiquetas_con_valores+ '\n'
        grafico += 'chdlp=bv \n'
        if suma_general == 0:
            break
        else:
            values.append((i.nombre, grafico))
      
    return values

def obtener_porcentaje(region, dimension, pais):
    indicadores = IndicadoresPorcentaje.objects.filter(dimension=dimension)
    if region == -1:
        #Todas las regiones
        universidades = Universidad.objects.all()
    elif region == -2:
        #Universidades de un pais
        universidades = Universidad.objects.filter(pais = pais)
    else:    
        universidades = Universidad.objects.filter(region_id=region)
    values = []
    for i in indicadores:
        
        universidad = []
        suma_universidades = []
        nro_de_universidades = universidades.count()
        suma_general = 0
        
        for u in universidades:
            respuestas_porcentaje = RespuestaPorcentaje.objects.filter( universidad = u.id, indicador_id = i.id ).order_by( '-fecha_fin' )
            if not respuestas_porcentaje.count() == 0:
                respuestas_porcentaje = RespuestaPorcentaje.objects.filter( universidad = u.id, indicador_id = i.id, fecha_fin = respuestas_porcentaje[0].fecha_fin )
                suma_por_universidad = 0
                promedio_universidad = 0
                for r in respuestas_porcentaje:
                    suma_por_universidad += float(r.respuesta)
                try:
                    promedio_universidad = suma_por_universidad / respuestas_porcentaje.count()
                except:
                    promedio_universidad = 0
                    
                suma_general += promedio_universidad
                suma_universidades.append(promedio_universidad)
                universidad.append(u.nombre)
            else:
                pass
        
        # Armar valores de retorno
        valores = []
        promedio = 0
        if suma_general == -1.00:
            suma_general = 0
        try:
            promedio = suma_general / universidades.count()
        except:
            promedio = 0
        
        valores.append(promedio)
        for y in suma_universidades:
            if y == -1.00:
                valores.append(0)
            else:
                valores.append(y)
        
        
        etiquetas = []
        etiquetas.append("Promedio")
        for u in universidad:
            etiquetas.append(u)
        
        etiquetas_con_valores = ''
        lista_de_valores = ''
        for y in range (0, len(etiquetas)):
            etiquetas_con_valores += str(etiquetas[y].encode("utf-8")).replace(" ", "+")+ '(' + str(round(valores[y],2)) + ')'
            lista_de_valores += str(valores[y])
            if y+1 != len(etiquetas):
                etiquetas_con_valores += '|'
                lista_de_valores += ','        
        
        #rango de valores
        limite_superior = max(valores) + 30
        #armar el grafico
        grafico = 'chxr=0,0,' + str(limite_superior) + '\n'
        grafico += 'chxt=x \n chbh=a \n'
        grafico += 'chs=' + str(ANCHO_GRAFICO) + 'x' + str(ALTO_GRAFICO*2) + '\n'
        grafico += 'cht=bhg'+ '\n'
        grafico += 'chco='+COLORES+ '\n'
        grafico += 'chd=t:'+ lista_de_valores + '\n'
        grafico += 'chdl='+ etiquetas_con_valores+ '\n'
        grafico += 'chdlp=bv \n'

                    
        if suma_general == 0:
            break
        else:
            values.append((i.nombre, grafico))
      
    return values



